//
// 线性表
// Created by 麻再挺 on 2021/1/19.
//
#ifndef DATA_STRUCTURE_C_LINEAR_LIST_IMPL_H
#define DATA_STRUCTURE_C_LINEAR_LIST_IMPL_H
#include <stdio.h>
#include <stdlib.h>
#include "./../constant.h"

// 线性表存储空间的初始分配量
#define LIST_INIT_SIZE 100
// 线性表存储空间的分配增量
#define LIST_INCREMENT 10

// 定义数据类型
typedef int ElemType;

// 线性表结构体
typedef struct {
    // 存储空间基地址
    ElemType *elem;
    // 当前长度
    int length;
    // 当前分配的存储空间容量(以sizeof(ElemType)为单位)
    int list_size;
}LinearList;

/**
 * 初始化线性表
 * @param list 线性表
 * @return
 */
Status Linear_List_Init(LinearList *list);

/**
 * 添加数据, 在最后一个位置添加
 * @param list 列表
 * @param elem 数据
 * @return
 */
Status Linear_List_Push(LinearList *list, ElemType elem);

/**
 * 插入线性表数据
 * @param list 线性表
 * @param i 位置
 * @param elem 数据
 * @return
 */
Status Linear_List_Insert(LinearList *list, int i, ElemType elem);

/**
 * 移除数据, 最后一位数据移除
 * @param list 线性表
 */
void Linear_List_Pop(LinearList *list);

/**
 * 删除线性表指定位置数据
 * @param list 线性表
 * @param i 位置
 * @return
 */
Status Linear_List_Delete(LinearList *list, int i);

/**
 * 查询指定元素在线性表中的位置
 * @param list 列表
 * @param elem 元素
 * @param compare 比较函数
 * @return -1: 不存在; 非-1: 元素索引
 */
int Linear_List_Locate_Elem(LinearList *list, ElemType elem, Status(*compare)(ElemType, ElemType));

/**
 * 合并两个列表
 * @param list1 待合并列表1(元素依值递增)
 * @param list2 待合并列表2(元素依值递增)
 * @param list3 合并后列表3(元素依值递增)
 * @return
 */
Status Linear_List_Merge(LinearList *list1, LinearList *list2, LinearList *list3);

/**
 * 判断列表是否为空
 * @param list 列表
 * @return TRUE: 空; FALSE: 不为空
 * @return
 */
Status Linear_List_Empty(LinearList *list);

/**
 * 列表长度
 * @param list 列表
 * @return 具体数值
 */
int Linear_List_Length(LinearList *list);

/**
 * 根据索引获取元素
 * @param list 列表
 * @param i 索引
 * @param elem 元素
 */
void Linear_List_Get_Elem(LinearList *list, int i, ElemType *elem);

/**
 * 打印列表数据
 * @param list 列表
 */
void Linear_List_Print(LinearList *list);



#endif //DATA_STRUCTURE_C_LINEAR_LIST_IMPL_H
